package dao;

import pojo.DVD;

import java.time.LocalDate;
import java.util.Arrays;

/**
 * dao:数据层  数据操作
 * 数据的初始化：在此处完成数据初始化
 */
public class DvdDaoImpl implements DvdDao {

    //通过对象数组保存DVD信息，默认只能保存10个  此处注意，我们需要静态化
    private static DVD[] dvds = new DVD[5];
    public static DVD[] getDvds() {
        return dvds;
    }
    public static void setDvds(DVD[] dvds) {
        DvdDaoImpl.dvds = dvds;
    }
    //通过静态代码块完成数据的初始化
    static {
        dvds[0] = new DVD("罗马假日", 0,
                LocalDate.of(2022, 1, 10), 20, 5);
        dvds[1] = new DVD("笑傲江湖", 1, null, 15, 6);
        dvds[2] = new DVD("杀死比尔", 1, null, 21, 4);
        dvds[3] = new DVD("风声鹤唳", 1, null, 18, 7);
    }

    /**
     * 新增DVD操作
     *
     * @param dvd 新增的dvd，注意，需要将dvd放置到第一个为null的元素上
     * @return 表示成功或失败
     */
    @Override
    public boolean insertDVD(DVD dvd) {
        boolean flag = false;  //新增成功或失败的标志
        for (int i = 0; i < dvds.length; i++) {
            if (dvds[i] == null) {
                dvds[i] = dvd;
                flag = true;
                break;
            }
        }
        return flag;
    }

    /**
     * 查看当前货架上都有哪些DVD
     * @return
     */
    @Override
    public DVD[] queryAll() {
        DVD[] dvds1 = null;
        //设定一个标志    true 表示货架此时商品已满
        boolean flag = true;
        for (int i = 0; i < dvds.length; i++) {
            //获取到货架上第一个空元素的下标，接着将此元素之前的dvd拷贝走
            if (dvds[i] == null) {
                dvds1 = Arrays.copyOf(dvds, i);
                flag = false;
                break;
            }
        }
        if (flag){
            return dvds;
        }
        return dvds1;
    }

    /**
     * 根据DVD的名字查询DVD信息
     * @param name
     * @return
     */
    @Override
    public DVD queryByName(String name) {

        DVD dvd = null;
        for (int i = 0; i < dvds.length; i++) {
            //通过遍历判断输入的dvd是否存在
            if (dvds[i] != null && dvds[i].getName().equals(name)){
                dvd = dvds[i];
                break;
            }
        }
        return dvd;
    }

    /**
     * 根据名称删除DVD
     * @param name
     * @return
     */
    @Override
    public boolean deleteByName(String name) {
        //删除的结果
        boolean flag = false;
        //遍历货架
        for (int i = 0; i < dvds.length; i++) {
            //查找要删除的dvd
            if (dvds[i] != null && dvds[i].getName().equals(name)){
                //查找到要删除的dvd后，将此dvd后面的dvd前移
                for (int j = i; j < dvds.length - 1; j++) {
                    dvds[j] = dvds[j + 1];
                }
                //最后一个元素置空
                dvds[dvds.length - 1] = null;
                //删除成功
                flag = true;
                break;
            }
        }
        return flag;
    }

    /**
     * 借出DVD
     * @param dvd
     * @return
     * LocalDate.now()   当前日期
     */
    @Override
    public boolean lendDvd(DVD dvd) {
        //表示借出是否成功
        boolean flag = false;
        for (int i = 0; i < dvds.length; i++) {
            //查询要借出的DVD
            if (dvds[i] != null && dvds[i].getName().equals(dvd.getName())){
                //将借出次数更新，同时将出借状态改为已借出，保存借出时间
                long count = dvds[i].getCount() + 1;
                dvds[i].setCount(count);
                dvds[i].setState(0);
                dvds[i].setDate(LocalDate.now());
                flag = true;
                break;
            }
        }
        return flag;
    }

    /**
     * 归还DVD
     * @param name
     * @return
     */
    @Override
    public boolean revert(String name) {
        boolean flag = false;
        for (int i = 0; i < dvds.length; i++) {
            if (dvds[i] != null && dvds[i].getName().equals(name)){
                dvds[i].setState(1);
                dvds[i].setDate(null);
                flag = true;
                break;
            }
        }
        return flag;
    }
}
